import axios from 'axios'
import store from '../store'
import { removeToken } from './auth'
import router from '@/router'
// 后端接口的基准路径
// const baseURL = 'http://ihrm-java.itheima.net/api/'
const baseURL = process.env.VUE_APP_BASE_API
// 创建axios新实例对象，因为要设置基准路径，并且保证可以设置多个基准路径
const instance = axios.create({
  baseURL: baseURL
})

// 请求拦截器
// 请求拦截器
instance.interceptors.request.use(function (config) {
  // 在发送请求之前做些什么
  const token = store.getters.token
  if (token) {
    // 如果token存在 注入token
    config.headers = {
      Authorization: `Bearer ${token}`
    }
  }
  return config
}, function (error) {
  // 对请求错误做些什么
  return Promise.reject(error)
})
// 添加响应拦截器,将后台返回的数据上外层的壳去掉，并且如果捕获到了错误信息，返回错误提示
instance.interceptors.response.use(res => {
  // 去掉一层data属性
  return res.data
}, (err) => {
  // 在这里判断token是否失效
  if (err.response.status === 401) {
    // 1.清除用户信息
    store.commit('user/setToken', null)
    // 2.清除失效token
    store.commit('user/updateUserInfo', null)
    // 3.清除缓存的token
    removeToken()
    // 4.跳转到登录页
    router.push('/login')
  }
  return Promise.reject(err)
})

// export default instance    这个是以前的导出方式，直接导出一个instance
// 现在要达成一个目标:无论采用何种请求方式,都用data进行参数传递
// 为何要采用如下方式封装?需要达到的目标是无论用何种传参方式最后都用data进行传参，这样可以在使用的时候非常的方便
export default (options) => {
  // 这里一定要retun,这样的话才能够拿到结果
  // 根据请求的方式决定请求参数的名称
  let key = ''
  // console.log(options.method)
  if (options.method) {
    // 这句的意思就是把别人传过来任何形式的get都转换为GET，来进行比较
    key = options.method.toUpperCase() === 'GET' ? 'params' : 'data'
  } else {
    // 没有传递method，此时采用默认请求方式get
    key = 'params'
  }
  // console.log(options, key)
  return instance({
    // 这一句的意思是method如果传值了就是用传得值，如果没有传值就默认为get
    method: options.method || 'get',
    url: options.url,
    // ES6规则：对象的key可以是动态的变量
    [key]: options.data
  })
}

// 测试代码
// 这是以前的使用方式，需要通过method的方式来使用不同的传参方式
// import request from "@/utils/request"
// import { get } from 'core-js/core/dict'
// get 请求
// request({
//   method: get,
//   url:#,
//   params: {
//     username: "admin"
//     password: '123456'
//   }

// })
// post 请求
// request({
//   method: post,
//   url:#,
//   data: {
//     username: "admin"
//     password: '123456'
//   }

// })
